package com.hnust.service.impl;

import com.hnust.dao.ClassDao;
import com.hnust.dao.MajorDao;
import com.hnust.domain.record.ClassRecord;
import com.hnust.service.ClassService;
import com.hnust.util.IDUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 创建人：彭鑫淼
 * 创建时间：2020/10/6
 * 描述：班级管理模块service实现类
 */
@Service("classService")
public class ClassServiceImpl implements ClassService {

    @Autowired
    public ClassDao classDao;

    @Autowired
    public MajorDao majorDao;

    /**
     * 获取学校所有年纪
     * @return
     * @throws Exception
     */
    @Override
    public Map getGrades() throws Exception{
        //开始年份（2010）---结束年份（现在）
        int beginYear=2010,endYear= Calendar.getInstance().get(Calendar.YEAR);
        List<String> grades=new ArrayList<>();
        for(int i=beginYear;i<=endYear;i++){
            grades.add(String.valueOf(i));
        }
        Map map=new HashMap();
        //将查找到的年纪放入map中，并返回 classDao.getGrades()
        map.put("grades", grades);
        return map;
    }

    /**
     * 根据学院、年纪获取所有专业
     * @param collegeId 学院Id
     * @param grade 年纪
     * @return
     * @throws Exception
     */
    @Override
    public Map getMajors(String collegeId, String grade) throws Exception{
        Map map=new HashMap();
        if(grade!=null&&!grade.equals("")){
            map.put("majors", classDao.getMajors(collegeId, grade));//将查找到的专业放入map中，并返回
        }else{
            map.put("majors", classDao.getMajorNames(collegeId));//将查找到的专业放入map中，并返回
        }
        return map;
    }

    /**
     * 根据年纪、专业获取所有班级号
     * @param grade 年纪
     * @param major 专业名
     * @return
     * @throws Exception
     */
    @Override
    public Map getNumbers(String grade, String major) throws Exception{
        Map map=new HashMap();
        map.put("numbers", classDao.getNumbers(grade, major));//将查找到的班级号放入map中，并返回
        return map;
    }

    /**
     * 获取学院所有班级
     * @param collegeId 学院Id
     * @param currentPage 当前页
     * @param rows 每页展示的数据数量
     * @return
     * @throws Exception
     */
    @Override
    public Map getClasses(String collegeId, Integer currentPage, Integer rows) throws Exception {
        Map map=new HashMap();
        //将查找到的班级信息和信息数量放入map中，并返回
        map.put("classRecords", classDao.getClasses(collegeId, rows*(currentPage-1), rows));
        map.put("count",classDao.getClassesNum(collegeId));
        return map;
    }

    /**
     * 查找指定班级
     * @param collegeId 学院Id
     * @param classRecord 查找的班级信息
     * @param currentPage 当前页
     * @param rows 每页展示的数据数量
     * @return
     * @throws Exception
     */
    @Override
    public Map queryClasses(String collegeId, ClassRecord classRecord, Integer currentPage, Integer rows) throws Exception  {
        Map map=new HashMap();
        //将查询到的班级信息和信息数量放入map中，并返回
        map.put("classRecords", classDao.queryClasses(collegeId, classRecord, rows*(currentPage-1), rows));
        map.put("count",classDao.queryClassesNum(collegeId, classRecord));
//        System.out.println("查询结果");
//        System.out.println(map);
        return map;
    }

    /**
     * 添加班级
     * @param classRecord 班级信息
     * @return
     * @throws Exception
     */
    @Override
    public Boolean addClasses(ClassRecord classRecord) throws Exception {
        Map hashMap=majorDao.getMajorId(classRecord.getMajor());
        Map<String,Object> map=new HashMap<>();
        //将class表中需要的数据，全部放在map中
        map.put("cla_id", IDUtil.getPrimaryKey());
        map.put("grade", classRecord.getGrade());
        map.put("cla_number", classRecord.getNumber());
        map.put("maj_id", hashMap.get("maj_id"));
        map.put("col_id", hashMap.get("col_id"));
        return classDao.addClasses(map);
    }

    /**
     * 添加班级
     * @param classIds 班级Id
     * @return
     * @throws Exception
     */
    @Override
    public <T> Boolean deleteClass(T classIds) {
        //根据传入的classIds进行类型判断
        if(classIds instanceof Map){
            return classDao.deleteClasses(((Map<String, String>) classIds).get("grade"),((Map<String, String>) classIds).get("majId"));
        }else{
            for(Map<String,String> map : (List<Map<String,String>>) classIds){
                Boolean result=classDao.deleteClasses(map.get("grade"),map.get("majId"));
                if(result==false){
                    return false;
                }
            }
            return true;
        }
    }

    @Override
    public Map getAllClasses(String collegeId, int page, int pageNum) throws Exception {
        int indexId=0;
        Map map=new HashMap<>();
        List<Map> list=classDao.getAllClass(collegeId,(page-1)*pageNum,pageNum);
        for (Map item : list){
            item.put("number",getClassStr(item.get("maj_id").toString(),item.get("grade").toString()));
            item.put("indexId",indexId++);
        }//修改map中的值
        map.put("classRecords",list);
        map.put("count",String.valueOf(classDao.getAllClassNum(collegeId)));
        System.out.println(map);
        return map;
    }

    //根据专业年纪获取所有班级并拼接成字符串
    private String getClassStr(String maj_id,String grade){
        List<String> number = classDao.getClassNumber(maj_id, grade);
        StringBuffer str=new StringBuffer();
        for (int i = 0; i < number.size(); i++) {
            if(i== number.size()-1){
                str.append(number.get(i));
            }else{
                str.append(number.get(i)+", ");
            }
        }
        return str.toString();
    }
}
